package redstar.onboarding.fragment;
import android.content.res.TypedArray;
import android.databinding.DataBindingUtil;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import redstar.onboarding.R;
import redstar.onboarding.adapter.ImageAdapter;
import redstar.onboarding.databinding.FragmentSceneThreeBinding;
import redstar.onboarding.helper.ViewHelper;
/**
* Created by Eoin on 8/8/16.
*/
public class SceneThreeFragment extends BaseSceneFragment {
private static final int SCROLL_OFFSET = 200;
private Point transitionDistance;
private int scrollOffsetX;
private int finishWidth, finishHeight;
private FragmentSceneThreeBinding binding;
public static SceneThreeFragment newInstance(int position) {
SceneThreeFragment scene = new SceneThreeFragment();
Bundle args = new Bundle();
args.putInt(KEY_POSITION, position);
scene.setArguments(args);
return scene;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
binding =
DataBindingUtil.inflate(inflater, R.layout.fragment_scene_three, container, false);
setRootPositionTag(binding.root);
setRecyclerView(binding.recycler1, getResources().obtainTypedArray(R.array.images_1));
setRecyclerView(binding.recycler2, getResources().obtainTypedArray(R.array.images_2));
setRecyclerView(binding.recycler3, getResources().obtainTypedArray(R.array.images_3));
setRecyclerView(binding.recycler4, getResources().obtainTypedArray(R.array.images_4));
setRecyclerView(binding.recycler5, getResources().obtainTypedArray(R.array.images_5));
if (savedState != null) {
transitionDistance = savedState.getParcelable("transitionDistance");
finishWidth = savedState.getInt("finishWidth");
finishHeight = savedState.getInt("finishHeight");
scrollOffsetX = savedState.getInt("scrollOffsetX");
moveScrollViews(0);
// make sure finish view is invisible
ImageView finishView =
(ImageView) binding.recycler2.getLayoutManager().findViewByPosition(3);
if (finishView != null) {
finishView.setVisibility(View.INVISIBLE);
}
}
return binding.getRoot();
}
private void setRecyclerView(RecyclerView recyclerView, TypedArray drawables) {
LinearLayoutManager layoutManager =
new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
ImageAdapter adapter = new ImageAdapter(drawables);
recyclerView.setAdapter(adapter);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("transitionDistance", transitionDistance);
outState.putInt("scrollOffsetX", scrollOffsetX);
outState.putInt("finishWidth", finishWidth);
outState.putInt("finishHeight", finishHeight);
}
@Override
public void enterScene(ImageView sharedElement, float position) {
if (transitionDistance == null) {
setTransition(sharedElement);
}
binding.root.setAlpha(1 - position);
sharedElement.setX(transitionDistance.x * (1 - position));
sharedElement.setY(-getResources().getDimension(R.dimen.tutorial_shared_element_translate_y)
+ (transitionDistance.y * (1 - position)));
scaleSharedElement(position, sharedElement);
setSharedImageRadius(sharedElement, position);
moveScrollViews(position);
}
private void setTransition(ImageView sharedElement) {
// get the finish view
ImageView finishView =
(ImageView) binding.recycler2.getLayoutManager().findViewByPosition(3);
finishView.setVisibility(View.INVISIBLE);
finishHeight = finishView.getHeight();
finishWidth = finishView.getWidth();
Point finishViewLocation = ViewHelper.getViewLocation(finishView);
// find the point of the screen(middle - half image) and for final point to be centered
int screenCenterX = ViewHelper.getDisplaySize(getActivity()).x / 2;
int finishWidth = finishView.getWidth() / 2;
int finishX = screenCenterX - finishWidth;
// the distance the recyclerview needs to scroll for the finish view to be centered
scrollOffsetX = finishX - finishViewLocation.x;
Point sharedLocation = ViewHelper.getViewLocation(sharedElement);
transitionDistance = new Point();
transitionDistance.x = finishX - sharedLocation.x;
transitionDistance.y = finishViewLocation.y - sharedLocation.y;
}
@Override
public void centerScene(ImageView sharedElement) {
binding.root.setAlpha(1.0f);
// make sure shared element is set in the correct place
sharedElement.setX(transitionDistance.x);
sharedElement.setY(-getResources().getDimension(R.dimen.tutorial_shared_element_translate_y)
+ transitionDistance.y);
scaleSharedElement(0, sharedElement);
setSharedImageRadius(sharedElement, 0);
moveScrollViews(0);
}
//position goes from -1.0 to 0.0
@Override
public void exitScene(ImageView sharedElement, float position) {
// last scene, it wont exit
}
@Override
public void notInScene() {
// reset scroll views
moveScrollViews(1.0f);
binding.root.setAlpha(0);
}
private void moveScrollViews(float position) {
// use and odd and even scroll so images don't end up perfectly aligned
int scroll = (int) (scrollOffsetX * (1 - position) + SCROLL_OFFSET);
scrollRecycleViewTo(binding.recycler1, -scroll);
scrollRecycleViewTo(binding.recycler2, scroll);
scrollRecycleViewTo(binding.recycler3, -scroll);
scrollRecycleViewTo(binding.recycler4, scroll);
scrollRecycleViewTo(binding.recycler5, -scroll);
}
private void scrollRecycleViewTo(RecyclerView recyclerView, int offset) {
LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
layoutManager.scrollToPositionWithOffset(2, offset);
}
private void scaleSharedElement(float position, ImageView sharedElement) {
float scaleX = 1 - ((float) finishWidth / sharedElement.getWidth());
float scaleY = 1 - ((float) finishHeight / sharedElement.getHeight());
// scale around the center
sharedElement.setPivotX(1.0f);
sharedElement.setPivotY(1.0f);
// scale the shared image to the finish views size
sharedElement.setScaleX((1 - (scaleX * (1 - position))));
sharedElement.setScaleY((1 - (scaleY * (1 - position))));
}
}